// 用来定义广告数据的路由
const { resolve } = require('path')
const fs = require('fs') //操作文件的模块
const express = require('express')
//引入操作管理员数据的model对象
const advModel = require('../db/advModel')
const { log } = require('console')
//创建路由器中间件
const router = express.Router()

// 添加广告数据的路由
router.post('/addAdv', async (req, res) => {
  // 获取上传的广告数据
  const { advTitle, advCate, advLink } = req.fields
  const { file } = req.files
  // 根据上传的图片信息,拼接一个未来浏览器可以访问这个图片的url地址
  // 目标地址: http://localhost:5001/文件名.jpg
  // 切割字符串,获取上传到服务器上的图片的文件名
  const filename = file.path.split('\\')[1]
  // 拼接url
  const advImg = `http://localhost:5001/${filename}`

  try {
    // 将上传的所有信息,以及图片添加到数据库中
    await advModel.create({ advTitle, advCate, advLink, advImg })
    // 获取数据库中最新的数据
    const data = await advModel.find()
    // 返回成功信息
    res.send({ code: 2, data, message: '广告添加成功' })
  } catch (error) {
    res.send({ code: 1, data: null, message: '网络问题,请稍后再试' })
  }
})

// 响应广告数据的路由
router.get('/getAdvs', async (req, res) => {
  try {
    const data = await advModel.find()
    res.send({ code: 2, data, message: '查找广告数据成功' })
  } catch (error) {
    res.send({ code: 1, data: null, message: '网络问题,请稍后再试' })
  }
})

// 删除一条广告数据的路由
router.get('/delAdv/:id', async (req, res) => {
  // 获取上传的被删除数据的id
  const { id } = req.params

  try {
    // 要根据id获取当前数据的advImg信息
    const result = await advModel.findOne({ _id: id })

    // 根据result.advImg获取要删除的那个文件的文件名
    const filename = result.advImg.replace('http://localhost:5001/', '')

    // 删除数据库中的指定数据
    await advModel.deleteOne({ _id: id })

    // 删除服务器中存储的和当前被删除的那条数据相关的图片
    // fs.unlinkSync('绝对路径') //这个方法要用来删除指定文件
    fs.unlinkSync(resolve(__dirname, '../upload', filename))

    res.send({ code: 2, data: null, message: '删除广告数据' })
  } catch (error) {
    res.send({ code: 1, data: null, message: '网络错误,请稍后再试' })
  }
})

// 响应一条广告数据的路由
router.get('/getAdv/:id', async (req, res) => {
  // 获取上传的id
  const { id } = req.params
  try {
    // 根据id获取广告数据
    const adv = await advModel.findOne({ _id: id })
    // 如果adv是一个对象,则说明查到了广告数据,如果adv为null,说明id有问题
    if (adv) {
      res.send({ code: 2, data: adv, message: '查找一条广告成功' })
    } else {
      res.send({ code: 1, data: null, message: '网络错误,请稍后再试' })
    }
  } catch (error) {
    res.send({ code: 1, data: null, message: '网络错误,请稍后再试' })
  }
})

// 修改一条广告数据的路由
router.post('/updateAdv', async (req, res) => {
  // 获取用户上传的数据
  // 注意: 随便修改的表单中没有id,但是修改数据必须要知道修改的是哪一条.所以前端请求修改的代码中必须传入一个id给服务器
  const { id, advCate, advLink, advTitle } = req.fields
  const { file } = req.files

  try {
    // 判断这次修改是否要修改图片
    if (file.size) {
      // 要修改图片
      // 拼接新的图片的url地址
      // 获取文件名
      const filename = file.path.split('\\')[1]
      const advImg = `http://localhost:5001/${filename}`
      // 修改数据库的数据
      await advModel.updateOne(
        { _id: id },
        { $set: { advCate, advLink, advTitle, advImg } }
      )
    } else {
      // 不修改图片
      // 直接修改数据库的数据
      await advModel.updateOne(
        { _id: id },
        { $set: { advCate, advLink, advTitle } }
      )
    }
    res.send({ code: 2, data: null, message: '修改广告成功' })
  } catch (error) {
    // 响应用户
    res.send({ code: 1, data: null, message: '网络错误,请稍后再试' })
  }
})

//导出路由器中间件
module.exports = router
